package com.zmz.juc.cas;

/*
 * 模拟 CAS 算法 CompareAndSwap的缩写
 */

class CompareAndSwap {
    private int value = 1;

    //获取内存值
    public synchronized int get() {
        return value;
    }

    /**
     * @param expectedValue 期待值
     * @param newValue      新值
     * @return 如果老值等于期待值就说明没被其他线程修改过，就把新值赋给老值
     */
    public synchronized int compareAndSwap(int expectedValue, int newValue) {
        int oldValue = value;
        if (oldValue == expectedValue) {
            this.value = newValue;
        }
        return oldValue;
    }

    /**
     * @param expectedValue 期待设置的值
     * @param newValue      新给的值
     * @return 是否赋值成功
     */
    public synchronized boolean compareAndSet(int expectedValue, int newValue) {
        return expectedValue == compareAndSwap(expectedValue, newValue);
    }
}

public class TestCompareAndSwap {

    public static void main(String[] args) {
        final CompareAndSwap cas = new CompareAndSwap();

        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int expectedValue = cas.get();
                    boolean b = cas.compareAndSet(expectedValue, (int) (Math.random() * 101));
                    System.out.println("是否成功设置了新值：" + b);
                }
            }).start();
        }

    }

}